home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Comm / AmiTCP30b2.lha / src / rpclib / bindresvport.c < prev    next >
C/C++ Source or Header  |  1994-03-09  |  3KB  |  95 lines

  1. /*
  2.  * $Id: bindresvport.c,v 1.2 1993/11/10 01:24:55 jraja Exp $
  3.  *
  4.  * $Log: bindresvport.c,v $
  5.  * Revision 1.2  1993/11/10  01:24:55  jraja
  6.  * Fixed includes (sys/errno.h -> errno.h, added sys/param.h).
  7.  * Added AMIGA specific includes.
  8.  *
  9.  */
  10. /*static  char sccsid[] = "@(#)bindresvport.c    2.2 88/07/29 4.0 RPCSRC 1.8 88/02/08 SMI";*/
  11. /*
  12.  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
  13.  * unrestricted use provided that this legend is included on all tape
  14.  * media and as a part of the software program in whole or part.  Users
  15.  * may copy or modify Sun RPC without charge, but are not authorized
  16.  * to license or distribute it to anyone else except as part of a product or
  17.  * program developed by the user.
  18.  * 
  19.  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  20.  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  21.  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  22.  * 
  23.  * Sun RPC is provided with no support and without any obligation on the
  24.  * part of Sun Microsystems, Inc. to assist in its use, correction,
  25.  * modification or enhancement.
  26.  * 
  27.  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  28.  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  29.  * OR ANY PART THEREOF.
  30.  * 
  31.  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  32.  * or profits or other special, indirect and consequential damages, even if
  33.  * Sun has been advised of the possibility of such damages.
  34.  * 
  35.  * Sun Microsystems, Inc.
  36.  * 2550 Garcia Avenue
  37.  * Mountain View, California  94043
  38.  */
  39.  
  40. /*
  41.  * Copyright (c) 1987 by Sun Microsystems, Inc.
  42.  */
  43.  
  44. #include <sys/param.h>
  45. #include <sys/types.h>
  46. #include <sys/socket.h>
  47. #include <netinet/in.h>
  48. #include <errno.h>
  49.  
  50. #ifdef AMIGA
  51. #include <proto/exec.h>
  52. #endif
  53.  
  54. /*
  55.  * Bind a socket to a privileged IP port
  56.  */
  57. bindresvport(int sd, struct sockaddr_in *sin)
  58. {
  59.     int res;
  60.     static short port;
  61.     struct sockaddr_in myaddr;
  62.     int i;
  63.  
  64. #define STARTPORT 600
  65. #define ENDPORT (IPPORT_RESERVED - 1)
  66. #define NPORTS    (ENDPORT - STARTPORT + 1)
  67.  
  68.     if (sin == (struct sockaddr_in *)0) {
  69.         sin = &myaddr;
  70.         bzero(sin, sizeof (*sin));
  71.         sin->sin_family = AF_INET;
  72.     } else if (sin->sin_family != AF_INET) {
  73.         errno = EPFNOSUPPORT;
  74.         return (-1);
  75.     }
  76.     if (port == 0) {
  77. #ifdef AMIGA
  78.         port = ((u_long)FindTask(NULL) % NPORTS) + STARTPORT;
  79. #else
  80.         port = (getpid() % NPORTS) + STARTPORT;
  81. #endif
  82.     }
  83.     res = -1;
  84.     errno = EADDRINUSE;
  85.     for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; i++) {
  86.         sin->sin_port = htons(port++);
  87.         if (port > ENDPORT) {
  88.             port = STARTPORT;
  89.         }
  90.         res = bind(sd,
  91.             (struct sockaddr *)sin, sizeof(struct sockaddr_in));
  92.     }
  93.     return (res);
  94. }
  95.